/// \file		WnTCPClient.h
/// \brief		WIND通信(TCP)客户端类的声明文件
/// \author		xuefeng
/// \version	1.0
/// \date		2011-07-19
/// \history	2011-07-19 新建

#pragma once

#include "ITCPClient.h"
#include "WnEndPoint.h"
#include "WnBaseIOService.h"

/// \brief WIND通信(TCP)客户端类
class WnTCPClient :	public ITCPClient, public WnEndPoint
{
public:
  /// \brief 构造函数
  /// \param oIoService IO异步处理服务
  /// \param poNotify 通报对象指针
  WnTCPClient(int id, ITCPClientNotify *poNotify, int HBInterval, unsigned short usThreadCount);
  /// \brief 析构函数
  virtual ~WnTCPClient(void);

  ///注册回调接口
  virtual void RegisterSpi(ITCPClientNotify *pSpi);

  /// \brief 连接MDF协议的TCP服务器
  /// \param szIP 服务器IP
  /// \param usPort 服务器端口
  /// \param blAuth 是否验证(暂不支持)
  /// \param unTimeOut 超时时间(单位毫秒)
  void ConnectServer(const char *szIP, unsigned short usPort, bool blAuth = false, unsigned int unTimeOut = 0);

  /// \brief 发送数据给MDF协议的服务器(与ConnectMDFServer配对使用)
  /// \param pbData 数据指针
  /// \param unDataSize 数据大小
  /// \return 是否发送成功
  bool SendDataToServer(const unsigned char *pbData, unsigned int unDataSize);

  /// \brief 与服务器断开网络连接
  void CloseSocket();

  /// \brief 连接非MDF协议的TCP服务器(兼容现有的服务器而设计)
  /// \param szIP 服务器IP
  /// \param usPort 服务器端口
  /// \param blAuth 是否验证(暂不支持)
  /// \param unTimeOut 超时时间(单位秒)
  virtual void ConnectOtherServer(const char *szIP, unsigned short usPort, bool blAuth = false, unsigned int unTimeOut = 0);

  /// \brief 发送数据给非MDF协议的服务器(与ConnectOtherServer配对使用，兼容现有的服务器而设计)
  /// \param pbData 数据指针
  /// \param unDataSize 数据大小
  /// \return 是否发送成功
  virtual bool SendDataToOtherServer(const unsigned char *pbData, unsigned int unDataSize);

  /// \brief 连接服务器通知函数
  /// \param apConnection 发出通知的连接
  /// \param nStatus 连接状态
  void OnConnect(CONNECTION_APTR apConnection, int nStatus);

  /// \brief 连接断开的通知函数
  /// \param apConnection 发出通知的连接
  /// \param nStatus 状态码
  void OnDisconnect(CONNECTION_APTR apConnection, int nStatus);

  /// \brief 接收到数据的处理函数
  /// \param apConnection 发出通知的连接
  /// \param apPacket 收到的数据包
  void OnReceiveData(CONNECTION_APTR apConnection, const PACKET_APTR& apPacket);

  /// \brief 数据解析错误的处理函数
  /// \param apConnection 发出通知的连接
  void OnDataError(CONNECTION_APTR apConnection);

  /// \brief 清除通报对象
  void ClearNotifyObj();

  // 消息回报
  virtual void OnMsg(int type, const std::string& msg);

protected:
  /// \brief 关闭终端
  void Close();

private:
  /// \brief 连接TCP服务器
  /// \param szIP 服务器IP
  /// \param usPort 服务器端口
  /// \param blAuth 是否验证(暂不支持)
  /// \param unTimeOut 超时时间(单位毫秒)
  void Connect(const char *szIP, unsigned short usPort, bool blAuth, unsigned int unTimeOut);

  /// \brief 发送数据给服务器
  /// \param pbData 数据指针
  /// \param unDataSize 数据大小
  /// \return 是否发送成功
  bool SendData(const unsigned char *pbData, unsigned int unDataSize);

  /// \brief 连接服务器的实际线程函数
  /// \param nStatus 连接状态
  void OnConnectThread(int nStatus);

  /// \brief 连接断开的实际线程函数
  /// \param nStatus 状态码
  void OnDisconnectThread(int nStatus);

  /// \brief 数据解析错误的线程函数
  void OnDataErrorThread();

  /// \brief 连接超时处理定时器函数
  /// \param oErrorCode 错误代码
  void OnConnectTimeOutTimer(const boost::system::error_code& oErrorCode);

  /// \brief 无接收数据定时器函数
  /// \param oErrorCode 错误代码
  void OnNoRecvDataTimer(const boost::system::error_code& oErrorCode);

private:
  /// \brief 与服务器的连接对象
  CONNECTION_APTR m_apConnection;

  /// \brief 连接超时定时器
  boost::shared_ptr<deadline_timer> m_oTimer;

  /// \brief 接收超时定时器
  boost::shared_ptr<deadline_timer> m_oTimeOutTimer;

  /// \brief 动作锁
  boost::mutex m_oOperateMutex;

  /// \brief 通报对象指针
  ITCPClientNotify *m_poNotify;

  /// \brief 通报对象锁
  boost::shared_mutex m_oNotifyMutex;

  /// \brief 服务端IP
  //const char *m_szIP;

  string m_szIP;

  /// \brief 服务端端口
  unsigned short m_usPort;

  /// \brief 授权标识
  bool m_blAuth;

  /// \brief 连接超时
  unsigned int m_unTimeOut;

  /// \brief 心跳间隔
  int m_HB_interval;

  // ios实例
  WnBaseIOService *m_poBaseIOService;
};

